package com.evil.common.oss.service.storage;

import com.evil.common.file.enums.FileServiceProviderEnum;
import com.evil.common.oss.props.base.BaseOssProperty;
import lombok.Getter;

import java.io.File;
import java.io.InputStream;
import java.net.URL;
import java.util.Date;

@Getter
public abstract class FileStorageService<T extends BaseOssProperty> {

    private final T property;

    public FileStorageService(T property) {
        this.property = property;
    }

    /**
     * 获取OSS类型
     *
     * @return int
     */
    public abstract FileServiceProviderEnum getServiceProvider();

    /**
     * 获取访问域名
     *
     * @return String
     */
    public String getHost() {
        return property.getHost();
    }

    /**
     * 获取预览域名
     *
     * @return String
     */
    public String getPreview() {
        return property.getPreview();
    }

    /**
     * 获取访问文件路径
     *
     * @return String
     */
    public String getVisitPath() {
        return property.getVisitPath();
    }

    /**
     * 获取文件URL参数
     *
     * @param path path
     * @return String fileName=FILE
     */
    public abstract String getFileUrl(String path);

    /**
     * 获取文件URL
     *
     * @param path     path
     * @param fileName fileName
     */
    public abstract String getDownloadUrl(String path, String fileName);

    /**
     * 文件上传
     *
     * @param data           data
     * @param path           path
     * @param sourceFileName sourceFileName
     * @param contentType    contentType
     * @param isPreview      是否预览
     * @return String
     */
    public abstract String upload(byte[] data, String path, String sourceFileName, String contentType, boolean isPreview);

    /**
     * 文件上传
     *
     * @param inputStream    inputStream
     * @param path           path
     * @param sourceFileName sourceFileName
     * @param contentType    contentType
     * @param isPreview      是否预览
     * @return String
     */
    public abstract String upload(InputStream inputStream, String path, String sourceFileName, String contentType, boolean isPreview);

    /**
     * 获取文件
     *
     * @param filePath filePath
     * @param file     输出的文件
     * @return File
     */
    public abstract File getFileByFilePath(String filePath, File file);

    /**
     * 获取下载URL
     *
     * @param filePath       文件path
     * @param fileName       文件名称
     * @param expirationTime 过期时间
     * @return URL
     */
    public abstract URL getDownloadUrl(String filePath, String fileName, Date expirationTime);
}
